package org.facyt.commons.view.window;

import org.facyt.commons.view.bean.AbstractBeanForm;

import com.vaadin.data.Container;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Table;
import com.vaadin.ui.VerticalLayout;

public abstract class TableWindow<T extends AbstractBeanForm> extends GenericWindow {

	protected Button botonAceptar;
	protected Button botonCancelar;
	protected Table table;

	@Override
	protected void agregarPanel() {
		VerticalLayout layout = crearLayout();
		agregarTabla(layout);
		agregarBotones(layout);
		addComponent(layout);

	}

	protected void agregarTabla(VerticalLayout layout) {
		table = new Table();
		table.setWidth(100, UNITS_PERCENTAGE);
		table.setPageLength(getPageLength());
		// Allow selecting items from the table.
		table.setSelectable(true);
		// Send changes in selection immediately to server.
		table.setImmediate(true);
		table.setColumnCollapsingAllowed(false);
		table.setNullSelectionAllowed(false);
		table.addStyleName("grilla-materia-prima");

		// table DataSource
		table.setContainerDataSource(getContainerDataSource());

		// visible columns
		table.setVisibleColumns(getVisibleColumns());
		
		layout.addComponent(table);

		// String Columns headers
		table.setColumnHeaders(getColumnHeaders());
	}

	

	/**
	 * Crea el panel que contiene el formulario y los botones
	 * 
	 * @return
	 */
	protected VerticalLayout crearLayout() {
		VerticalLayout layout = new VerticalLayout();
		addComponent(layout);
		return layout;
	}

	/**
	 * Agrega los botones
	 * 
	 * @param layout
	 */
	protected void agregarBotones(VerticalLayout layout) {
		HorizontalLayout horizontalLayout = new HorizontalLayout();
		if (isBotonAceptarVisible()) {
			botonAceptar = new Button();
			botonAceptar.addStyleName("boton-facyt");
			botonAceptar.setCaption(obtenerNombreBotonAceptar());
			botonAceptar.addListener(new Button.ClickListener() {
				@Override
				public void buttonClick(ClickEvent event) {
					aceptar();
				}

			});

			horizontalLayout.addComponent(botonAceptar);
			horizontalLayout.setComponentAlignment(botonAceptar,
					Alignment.MIDDLE_RIGHT);
		}

		if (isBotonCancelarVisible()) {
			botonCancelar = new Button();
			botonCancelar.setCaption(obtenerNombreBotonCancelar());
			botonCancelar.addStyleName("boton-facyt");
			botonCancelar.addListener(new Button.ClickListener() {
				@Override
				public void buttonClick(ClickEvent event) {
					cancelar();
				}
			});
			horizontalLayout.addComponent(botonCancelar);
			horizontalLayout.setComponentAlignment(botonCancelar,
					Alignment.MIDDLE_RIGHT);
		}

		horizontalLayout.setSpacing(true);
		layout.setSpacing(true);
		layout.addComponent(horizontalLayout);
		layout.setComponentAlignment(horizontalLayout, Alignment.BOTTOM_RIGHT);
	}

	/**
	 * Obtiene el nombre del boton aceptar
	 * 
	 * @return
	 */
	protected abstract String obtenerNombreBotonAceptar();

	/**
	 * Obtiene el nombre del boton cancelar
	 * 
	 * @return
	 */
	protected abstract String obtenerNombreBotonCancelar();

	/**
	 * Desde este metodo se puede llamar al servicio
	 */
	protected abstract void aceptar();

	/**
	 * Realiza la accion cancelar
	 */
	protected abstract void cancelar();

	/**
	 * Verifica si el boton aceptar es visible
	 * 
	 * @return
	 */
	protected abstract boolean isBotonAceptarVisible();

	/**
	 * Verifica si el boton cancelar es visible
	 * 
	 * @return
	 */
	protected abstract boolean isBotonCancelarVisible();

	/**
	 * Obtiene la cantidad de filas por pagina
	 * 
	 * @return
	 */
	protected abstract int getPageLength();
	
	/**
	 * Obtiene los nombres de las columnas
	 */
	protected abstract String[] getColumnHeaders();

	/**
	 * Obtiene las columnas que seran visibles
	 * @return
	 */
	protected abstract Object[] getVisibleColumns();

	/**
	 * Obtiene el datasource
	 * @return
	 */
	protected abstract Container getContainerDataSource();

}
